﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using WaterBill.BUS;
using WaterBill.DTO;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraPrinting;
using System.Diagnostics;

namespace WaterBill.GUI
{
    public partial class frmImportBill : DevExpress.XtraEditors.XtraForm
    {
        BUS_Customers busCus = new BUS_Customers();
        BUS_Bills busBill = new BUS_Bills();
        BUS_Charges busCharge = new BUS_Charges();
        public frmImportBill()
        {
            InitializeComponent();
        }

        private void frmImportBill_Load(object sender, EventArgs e)
        {
            loadDataForm();
        }

        private void loadDataForm()
        {
            //if (this.gcCustomer.DataSource == null)
            //{
            //    this.gcCustomer.DataSource = busCus.BUS_Customers_GetStatusEnable();
            //}
            DataTable dtCharge = busCharge.BUS_Charge_GetByMaxId();
            if (dtCharge.Rows.Count > 0)
            {
                this.lblNameCharge.Text = dtCharge.Rows[0]["NameCharge"].ToString();
                this.txtChargeId.Text = dtCharge.Rows[0]["ChargeId"].ToString();
                this.chkSelectAll.Checked = false;
                tabpageImportNow.Text = "Nhập hóa đơn tháng " + this.lblNameCharge.Text;
                tabpageAddBill.Text = "Thêm hóa đơn mới cho tháng " + this.lblNameCharge.Text;
                int ChargeId = Convert.ToInt32(this.txtChargeId.Text);
                gcCustomerNotBill.DataSource = busCus.BUS_Customers_GetNotBillOfCharge(ChargeId);
                gcBill.DataSource = busBill.BUS_Bills_GetByChargeId(ChargeId);
            }                  
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
            splashScreenManager1.ShowWaitForm();
            loadDataForm();
            splashScreenManager1.CloseWaitForm();
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            this.gvBill.MoveNext();
        }

        private void btnPrev_Click(object sender, EventArgs e)
        {
            this.gvBill.MovePrev();
        }

        private void chkSelectAll_CheckedChanged(object sender, EventArgs e)
        {
            if (gvCustomerNotBill.RowCount > 0)
            {
                if (this.chkSelectAll.Checked == true)
                {
                    gvCustomerNotBill.SelectAll();
                    foreach (int i in gvCustomerNotBill.GetSelectedRows())
                    {
                        gvCustomerNotBill.SetRowCellValue(i, "selection", 1);
                    }
                }
                else
                {
                    foreach (int i in gvCustomerNotBill.GetSelectedRows())
                    {
                        gvCustomerNotBill.UnselectRow(i);
                        gvCustomerNotBill.SetRowCellValue(i, "selection", 0);
                    }
                }
            }
        }

        private void gvBill_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
            if (((GridView)sender).Columns["NewIndex"] == ((GridView)sender).FocusedColumn)
            {
                try
                {
                    if (e.Value.ToString() != "")
                    {
                        if (Convert.ToInt32(((GridView)sender).GetRowCellValue(((GridView)sender).FocusedRowHandle, "OldIndex").ToString()) < Convert.ToInt32(e.Value))
                        {
                            DTO_Bills obj = new DTO_Bills();
                            obj.BillId = Convert.ToInt32(((GridView)sender).GetRowCellValue(((GridView)sender).FocusedRowHandle, "BillId"));
                            obj.NewIndex = Convert.ToInt32(e.Value);
                            obj.UserId = Convert.ToInt32(frmMain._DtUser.Rows[0]["UserId"].ToString());
                            if (busBill.BUS_Bills_Update(obj))
                            {
                                return;
                            }
                            else
                            {
                                e.ErrorText = "Lỗi, không thể thêm được";
                            }

                        }
                        else
                        {
                            e.ErrorText = "Chỉ số mới phải lớn hơn chỉ số cũ";
                        }
                    }
                    else
                    {
                        e.ErrorText = "Chỉ số nhập vào không được rỗng. Nhấn ESC để bỏ qua.";
                    }
                }
                catch
                {
                    e.ErrorText = "Chỉ số nhập vào phải là số";
                }

                e.Valid = false;
            }
        }

        private void btnPrint_Click(object sender, EventArgs e)
        {
            try
            {
                rptBillImport rptBill = createReport();
                rptBill.PrintDialog(); 
            }
            catch
            {
            }
            
        }

        private void btnExportExcel_Click(object sender, EventArgs e)
        {
            try
            {
                string path = string.Empty;
                FileDialog fd = new SaveFileDialog();
                fd.Filter = "file type (*.xls)|*.xls";
                fd.DefaultExt = "xls";
                path = fd.ShowDialog() == DialogResult.OK ? fd.FileName : "";
                rptBillImport rptBill = createReport();
                XlsExportOptions xlsEO = rptBill.ExportOptions.Xls;
                xlsEO.ShowGridLines = true;
                xlsEO.TextExportMode = TextExportMode.Value;
                xlsEO.ExportHyperlinks = true;
                rptBill.ExportToXls(path);
                if (XtraMessageBox.Show("Xuất Excel thành công.\n Bạn có muốn mở tập tin nào không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) == DialogResult.Yes)
                {
                    Process process = new Process();
                    process.StartInfo.FileName = path;
                    process.Start();
                    process.WaitForInputIdle();
                }
            }
            catch { }
        }

        private rptBillImport createReport()
        {
            DataSet dsBill = new DataSet();
            DataTable dtBill = new DataTable();
            dtBill.Columns.Add("FullName", typeof(string));
            dtBill.Columns.Add("Address", typeof(string));
            dtBill.Columns.Add("BillNumber", typeof(string));
            dtBill.Columns.Add("NameCharge", typeof(string));
            dtBill.Columns.Add("OldIndex", typeof(int));
            dtBill.Columns.Add("NewIndex", typeof(int));
            DataRow dr;
            for (int i = 0; i < gvBill.RowCount; i++)
            {
                dr = dtBill.NewRow();             
                dr = (DataRow)gvBill.GetDataRow(i);
                dtBill.ImportRow(dr);
            }
            dsBill.Tables.Add(dtBill);
            rptBillImport rptBill = new rptBillImport();
            rptBill.DataSource = dsBill;
            rptBill.DataMember = dsBill.Tables[0].TableName;
            rptBill.lblFullName.DataBindings.Add("Text", null, "FullName");
            rptBill.lblAddress.DataBindings.Add("Text", null, "Address");
            rptBill.lblBillNumber.DataBindings.Add("Text", null, "BillNumber");
            rptBill.lblOldIndex.DataBindings.Add("Text", null, "OldIndex");
            rptBill.lblNewIndex.DataBindings.Add("Text", null, "NewIndex");
            rptBill.lblNameCharge.Text = "DANH SÁCH NHẬP HÓA ĐƠN CỦA THÁNG " + this.lblNameCharge.Text;
            return rptBill;
        }

        private void btnImportExcel_Click(object sender, EventArgs e)
        {
            try
            {
                string path = string.Empty;
                FileDialog fd = new OpenFileDialog();
                fd.Filter = "file type (*.xls)|*.xls";
                fd.DefaultExt = "xls";
                path = fd.ShowDialog() == DialogResult.OK ? fd.FileName : "";
                BUS_Excel busExcel = new BUS_Excel();
                DataTable dt = busExcel.BUS_Excel_ReadFile03(path);
                int countsuccess = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DTO_Bills obj = new DTO_Bills();
                    if (dt.Rows[i][1].ToString().Trim() != "" && dt.Rows[i][5].ToString().Trim() != "")
                    {
                        try
                        {
                            obj.BillNumber = dt.Rows[i][1].ToString();
                            obj.NewIndex = Convert.ToInt32(dt.Rows[i][5].ToString());
                            obj.UserId = Convert.ToInt32(frmMain._DtUser.Rows[0]["UserId"].ToString());
                            if (busBill.BUS_Bills_UpdateByBillNumber(obj))
                            {
                                countsuccess++;
                            }
                        }
                        catch
                        {
                        }
                    }
                }
                XtraMessageBox.Show("Có " + countsuccess + " dòng được cập nhật thành công.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                loadDataForm();
            }
            catch
            {
            }
        }

        private void btnAddBill_Click(object sender, EventArgs e)
        {
            Boolean flag = false;
            for (int i = 0; i < gvCustomerNotBill.RowCount; i++ )
            {
                if (Convert.ToInt32(gvCustomerNotBill.GetRowCellValue(i, "selection")) == 1)
                {                  
                    flag = true;
                    break;
                }
            }
            int CountSuccess = 0;
            int CountSelection = 0;
            if (flag)
            {
                splashScreenManager1.ShowWaitForm();
                try
                {
                    int ChargeId = Convert.ToInt32(txtChargeId.Text);
                    for (int j = 0; j < gvCustomerNotBill.RowCount; j++)
                    {
                        if (Convert.ToInt32(gvCustomerNotBill.GetRowCellValue(j, "selection")) == 1)
                        {
                            CountSelection++;
                            DTO_Bills obj = new DTO_Bills();  
                            obj.CustomerId = Convert.ToInt32(gvCustomerNotBill.GetRowCellValue(j, "CustomerId"));
                            obj.ChargeId = ChargeId;
                            if (busBill.BUS_Bills_Insert(obj))
                            {
                                CountSuccess++;
                            }
                        }
                    }
                }
                catch
                {
                    XtraMessageBox.Show("Lỗi, đã xãy ra lỗi. Có " + CountSuccess + " hóa đơn được thêm thành công.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                loadDataForm();
                splashScreenManager1.CloseWaitForm();
                XtraMessageBox.Show("Có "+CountSuccess+" hóa đơn được thêm thành công trong tổng số "+CountSelection+" khách hàng được chọn.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);               
            }
            else
            {
                XtraMessageBox.Show("Cảnh báo, chưa có dòng nào được chọn để thêm.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void checkSelectionCus_CheckedChanged(object sender, EventArgs e)
        {
            if (((CheckEdit)sender).Checked)
            {
                gvCustomerNotBill.SetRowCellValue(gvCustomerNotBill.FocusedRowHandle, "selection", 1);
            }
            else
            {
                gvCustomerNotBill.SetRowCellValue(gvCustomerNotBill.FocusedRowHandle, "selection", 0);
            }
        }

    }
}